home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: Alpha / Whiteline Alpha.iso / dl_serie / 031 / gfa_gdos / gdos.txt < prev    next >
Encoding:
Text File  |  1994-09-25  |  11.0 KB  |  184 lines

  1.      Aus 'ST-Computer', Ausgabe 3/92: 'Druckeransteuerung via GDOS'
  2.  
  3.      Das GFA-BASIC ab der Version 3.x verfügt im Prinzip über alle nötigen Funktio-
  4.      nen für den Umgang mit GDOS. Solange man seine Schriften nur auf dem Bild-
  5.      schirm ausgibt, stellen sich auch keine Probleme. Interessant wird es aber,
  6.      wenn man versucht, auch seinem Drucker GDOS-Qualität zukommen zu lassen.
  7.      Hier stößt man gleich auf mehrere Schwierigkeiten...
  8.  
  9.      Problematisch: Welche GDOS-Version muß es sein?
  10.       GFA-BASIC steuert nur die GDOS-Versionen 1.x korrekt an, neuere Versionen wie
  11.       z.B. AMC-GDOS führen zum Absturz. Das ist umso ärgerlicher, da viele Program-
  12.       me (z.B. GEMINI, INTERFACE, TURBO-C) die Arbeit mit den alten GDOS-Versionen
  13.       strikt ablehnen, was aufgrund der Fehleranfälligkeit auch zu verstehen ist.
  14.  
  15.       Das Scheitern der BASIC-Ansteuerung liegt wahrscheinlich in der fehlenden
  16.       Handle-Übergabe beim Aufruf der VDI-Routinen. Die neueren GDOS-Versionen
  17.       erwarten das Gerätehandle immer in CONTRL(6), was das BASIC wohl vernachläs-
  18.       sigt. Das führt dazu, das alle VDI-Aufrufe wie TEXT oder PLOT auf den
  19.       Bildschirm bezogen werden.
  20.  
  21.      Ausgespielt: Der DEFTEXT-Befehl.
  22.       Zeichensatz und Größe stellt man normalerweise über den Befehl 'DEFTEXT
  23.       farbe,stil,winkel,höhe,font' ein.
  24.       Vielleicht haben Sie sich schon einmal gefragt, warum dieser Befehl so eigen-
  25.       artige Werte als Größenangabe erwartet. Warum z.B. 13 für die normale System-
  26.       schrift, die doch eigentlich 16 Pixel hoch ist?
  27.       Der Grund liegt in der Unterscheidung zwischen ZELLEN- und ZEICHENGRÖßE.
  28.       Die Zeichenzelle gibt das Raster an, in dem der Zeichensatz erstellt werden
  29.       kann, also 8*16 beim Systemfont. Die Zeichengröße dagegen sagt aus, wieviele
  30.       Rasterpunkte tatsächlich belegt sind, also nur 7*13 beim Systemfont.
  31.  
  32.       DEFTEXT erwartet nun also die tatsächliche ZEICHENHÖHE in Pixeln, was sich
  33.       bereits bei unbekannten BILDSCHIRM-Zeichensätzen als problematisch erweist.
  34.       Bei der Drucker-Ansteuerung zeigt sich DEFTEXT aber von einer Seite, die man
  35.       hinter seinem biederen Erscheinungsbild nicht vermuten würde:
  36.       Zunächst hat ein Zeichen auf dem Drucker natürlich ganz andere Ausmaße, so
  37.       daß die Pixelangabe viel zu ungenau ist. Aber damit könnte man noch leben,
  38.       wenn nicht je nach Art und Anzahl der geladenen Zeichensätze immer andere Er-
  39.       gebnisse auf dem Drucker erscheinen, als man erwarteten dürfte. Teilweise muß
  40.       man den Befehl zweimal hintereinander ausführen, damit er wirksam wird. Die
  41.       tatsächlich eingestellte Größe der Zeichen scheint hier von allem möglichen
  42.       beeinflußt zu werden, nur nicht von DEFTEXT.
  43.  
  44.       Dieser Befehl führt also auf Bildschirm und Drucker zu unterschiedlichen Er-
  45.       gebnissen und ist daher für unsere Zwecke nicht zu gebrauchen.
  46.  
  47.      Die Lösung: VDI-Routinen im Eigenbau.
  48.       GFA-BASIC gewährt uns den einfachen und C-kompatiblen Zugriff auf sämtliche
  49.       VDI-Routinen. Also schreiben wir die von uns benötigten Funktionen mit kor-
  50.       rekter Handle-Übergabe selbst (Quelle 2).
  51.       Da wir klugerweise bei dieser Gelegenheit auch die Routinen VST_FONT() und
  52.       VST_POINT() implementieren, können wir auf den DEFTEXT Befehl ganz
  53.       verzichten.
  54.       Über VST_FONT() legen wir den Zeichensatz fest (entspricht dem 5. DEFTEXT
  55.       Parameter), VST_POINT() stellt die Zeichenhöhe in POINT ein. Point ist ein
  56.       Satzmaß (ca. 0,353 mm) und findet häufig bei der Größenangabe von Zeichensät-
  57.       zen Verwendung. Auch im Dateinamen eines GDOS-Fonts ist diese Angabe immer
  58.       enthalten (z.B. 'ATTP10.FNT').
  59.       VST_POINT() hat als Rückgabewert die tatsächlich eingestellte Textgröße,
  60.       da die gewünschte Höhe ja nicht unbedingt im Zeichensatz vorgesehen ist.
  61.       Außerdem werden noch die Zeichen- und Zellenausmaße des eingestellten Zei-
  62.       chensatzes geliefert.
  63.  
  64.       Da wir den DEFTEXT-Befehl durch die VST_POINT()-Funktion ersetzen, erhalten
  65.       wir sowohl für den Bildschirm als auch den Drucker die gleichen Textgrößen
  66.       und müssen uns nicht mit der leidigen Pixelangabe herumschlagen.
  67.  
  68.      Ersatz für den TEXT-Befehl: V_JUSTIFIED()
  69.       Den TEXT-Befehl des GFA-BASIC ersetzen wir durch V_JUSTIFIED(). Da diese
  70.       Funktion ein paar mehr Parameter als das GFA-Pendant erwartet, gibt es zur
  71.       Vereinfachung die Prozedur text, die den Funktionsaufruf enthält (Zeile 345).
  72.       Die zusätzlichen Parameter beziehen sich auf die Ausrichtung des Textes, die
  73.       in ähnlicher Form auch dem GFA-Befehl 'TEXT x&,y&,l&,a$' übergeben werden
  74.       können. Der 3. Parameter liegt hierbei die Länge der Textausgabe fest.
  75.       Auf diese Weise kann ein Text ohne große Mühe, und ohne direkt verändert zu
  76.       werden, im Blocksatz ausgegeben werden. Dies geschieht bei l&>0 über die Ver-
  77.       änderung des Zeichenabstandes oder durch die Veränderung des Wortabstandes
  78.       bei l&<0 (Quelle 1).
  79.       Bei unserer Implementation V_JUSTIFIED() ist diese Angabe auf 3 Parameter
  80.       verteilt. Hier kann für den Zeichen- und Wortabstand getrennt angegeben
  81.       werden, ob eine Dehnung stattfinden soll (>0) oder nicht (=0).
  82.  
  83.      Unverzichtbar: Das Gerätehandle
  84.       Unsere selbstgeschriebenen VDI-Funktionen erwarten als ersten Parameter
  85.       immer das Gerätehandle. Für den Bildschirm übergeben wir hier V~H, eine
  86.       BASIC-Variable, die das bei Programmstart ermittelte Bildschirm-Handle
  87.       enthält. Für den Drucker erhalten wir das Handle über V_OPNWK() (Zeile 101).
  88.       V_OPNWK() ist übrigens der einzige GFA-GDOS-Befehl, den wir für die Drucker-
  89.       ausgabe verwenden können, alle anderen müssen ersetzt werden.
  90.  
  91.       Nun können wir, wie es auch im Sinne des VDI ist, Bildschirm und Drucker
  92.       mit denselben Befehlen ansprechen.
  93.  
  94.      So geht's: Das Listing.
  95.       Das vorliegende Programm lädt die verfügbaren Zeichensätze und gibt sie mit
  96.       den gleichen Funktionen zunächst auf dem Bildschirm und dann auf dem Drucker
  97.       aus.
  98.       Die folgende Beschreibung gilt daher sowohl für die Bildschirm- als auch die
  99.       Druckerausgabe. Für den Bildschirm muß allerdings keine Workstation geöffnet
  100.       (und am Ende wieder geschloßen) werden, da dies bereits beim Start des
  101.       GFA-BASIC geschieht.
  102.  
  103.      Speicherreservierung über RESERVE.
  104.       Für das Öffnen der Drucker-Workstation und das Laden der Zeichensätze wird
  105.       eine ganze Menge Speicher benötigt. Wieviel genau, ist von der Auflösung
  106.       Ihres Druckers und der Anzahl der Zeichensätze abhängig (beim FX85 z.B. ca.
  107.       400 KB, beim ATARI LASER 1,5 MB).
  108.       Über RESERVE wird zunächst der BASIC-Speicher eingeschränkt und dem System
  109.       überlassen. Ein beliebter Anfängerfehler besteht darin, hier einen Wert zu
  110.       verwenden, der nicht durch 256 teilbar ist, was dann bei der Freigabe meist
  111.       zum 'Fehler bei RESERVE...' führt.
  112.  
  113.      'Workstation öffne dich...'
  114.       Dann öffnen wir für den Drucker eine Workstation über V_OPNWK() und erhalten
  115.       das Handle zurück, über das wir dieses Gerät von nun an ansprechen können.
  116.       Aus dem INTOUT()-Feld können wir diverse Informationen über die Workstation
  117.       auslesen. INTOUT(0) und INTOUT(1) z.B. geben die Auflösung des Gerätes in
  118.       Pixeln an. Die Felder müssen unmittelbar nach dem V_OPNWK()-Aufruf ausgelesen
  119.       werden, da sie sonst durch andere Werte überschrieben werden.
  120.       In C werden diese Informationen normalerweise aus dem GEM WORK_OUT()-Feld
  121.       gelesen. Auch im GFA-BASIC existiert dieses Feld. Allerdings enthält es IMMER
  122.       die Parameter, die der V_OPNVWK()-Aufruf beim Start des GFA-BASIC für den
  123.       BILDSCHIRM ergeben hat. Diese Tatsache geht aus dem BASIC-Handbuch nicht klar
  124.       hervor und ist sicherlich für den Anfänger zunächst verwirrend.
  125.  
  126.      Das Laden der Zeichensätze.
  127.       Die Zeichensätze werden über ~VST_LOAD_FONTS() geladen bzw. verfügbar ge-
  128.       macht. Nun ermitteln wir die vorhandenen Zeichensätze und ihren Index mittels
  129.       VQT_NAME(). Nur über diesen Index können wir die Fonts später ansprechen.
  130.       Jede Schriftenfamilie hat einen eigenen Index, SWISS z.B. hat die Nummer 2.
  131.       ~VST_LOAD_FONTS() lädt verständlicherweise auch immer nur einen Vertreter
  132.       dieser Familie. Möchten Sie also mehrere Zeichensätze einer Familie (z.B:
  133.       SWISS, EPSON SWISS und IBM SWISS) gleichzeitig installieren, um sie besser
  134.       vergleichen zu können, so würde nur der als erster im ASSIGN.SYS eingetrage-
  135.       ne Zeichensatz geladen werden.
  136.       Wenn Sie allerdings wissen, daß der Fontindex im ersten Wort des Zeichensatz-
  137.       headers steht, so können Sie diesen Wert PROVISORISCH mit einem geeigneten
  138.       Texteditor (Tempus, Mortimer) ändern.
  139.  
  140.      Welche Pointgrößen gibt es?
  141.       Zur Ermittlung der vorhandenen Pointgrößen wäre es am besten, sich über die
  142.       sogenannte FONT-RING-LISTE durch die Header der einzelnen Zeichensätze zu
  143.       hangeln. Hierzu müßten wir aber eine LINE_A-Variable benutzen, weshalb wir
  144.       auf diese Möglichkeit verzichten und stattdessen folgende anwenden:
  145.       Die Funktion VST_POINT() liefert die tatsächlich eingestellte Pointgröße zu-
  146.       rück. In der Prozedur point_groessen (Zeile 145) gehen wir nun alle Zeichen-
  147.       sätze durch, probieren alle möglichen Höhen aus und tragen die tatsächlich
  148.       eingestellten Größen im String s_point$() bzw. p_point$() ein.
  149.       Der Nachteil dieser Methode: Da der ROM-Bildschirmtreiber Zeichensätze auf
  150.       die doppelte Größe skalieren kann, werden auch Höhen zurückgegeben, die
  151.       nicht als eigener Zeichensatz existieren. Die Qualität dieser vergrößerten
  152.       Schriften läßt meist zu wünschen übrig.
  153.  
  154.       Wir wissen nun, welche Zeichensätze es gibt und in welchen Größen wir sie
  155.       ausgeben können.
  156.  
  157.      Die Ausgabe kann beginnen.
  158.       Nun stellen wir mittels VST_FONT() den gewünschten Zeichensatz und über
  159.       VST_POINT() seine Größe ein und geben die Texte über V_JUSTIFIED() aus. Bei
  160.       der Bildschirmausgabe erscheinen die Schriften sofort, beim Drucker werden
  161.       sie zunächst in einem internen Puffer (Display-List) gespeichert und erst
  162.       über V_UPDWK() ausgedruckt.
  163.  
  164.       Danach entfernen wir die Fonts über VST_UNLOAD_FONTS(), schließen die Druk-
  165.       ker-Workstation mit V_CLSWK() und geben den reservierten Speicher wieder
  166.       frei.
  167.  
  168.      Nachsatz zur Klärung.
  169.       Die im Text genannten Probleme mit den GFA-Befehlen beziehen sich lediglich
  170.       auf die DRUCKER-Ansteuerung. Solange Sie Ihre Ausgaben nur auf dem Bildschirm
  171.       tätigen, können Sie sowohl neuere GDOS-Versionen als auch die GFA-eigenen
  172.       Funktionen (TEXT, DEFTEXT, VST_LOAD_FONTS() usw.) verwenden.
  173.       Allerdings ist auch hier der Ersatz von DEFTEXT durch VST_POINT() zur Ein-
  174.       stellung der Fontgröße sinnvoll, da so eine wesentlich präzisere Größenangabe
  175.       möglich ist.
  176.  
  177.      Quellenangaben:
  178.       1. GFA-BASIC 3.0 Handbuch,
  179.          GFA-Systemtechnik GmbH
  180.       2. ATARI ST/STE/TT-Profibuch,
  181.          10. Auflage, Sybex Verlag
  182.  
  183.      Gregor Duchalski
  184.